package threadTest.volatileTest;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 功能描述: volatile 不保证原子性, 但是可以使用过Atomic 调用 Unsafe 来保证原子性
 * 2024/03/13
 * <p>
 * ZhangYi
 */
public class VolatileTest02 {

    private static volatile int num = 0;

    private static volatile int num2 = 0;

    private static volatile AtomicInteger atomicInteger = new AtomicInteger(0);
    public static void add(){
        num++; // volatile 关键字 不保证原子性, mov 移动, add 相加 , load 加载 , store 存储
    }

    /**
     * 功能描述: volatile 关键字为了保证原子性,  可以使用lock 锁, 或者synchronized
     */
    public synchronized static void addNum(){
        num2++;
    }

    /**
     * 功能描述: 可以使用AtomicInteger 保证原子性
     */
    public static void addAtomic(){
        atomicInteger.incrementAndGet();
    }

    public static void main(String[] args){
        for (int index = 0; index < 3; index++) {
            for (int i = 0; i < 10; i++) {
                new Thread(()->{
                    for (int j =0;j<1000;j++){
                        add();
                        addNum();
                        addAtomic();
                    }
                },"线程"+String.valueOf(i)).start();
            }
            // 确保线程执行完毕 main 线程+GC 线程, 是java的默认线程
            while (Thread.activeCount()>2){
                Thread.yield();
            }

        }
        // 输出变量num 的值 , 如果volatile保证原子性, 则输出为3000
        //num = 29501
        System.out.println("num = " + num);
        System.out.println("num2 = " + num2);
        System.out.println("atomicInteger = " + atomicInteger.get());
    }
}
